package com.herench.bs.transfer;

import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 获取患者住院费用清单
 *
 * @author liuxiaohui
 * @date 2019/3/26
 */
public class GetHosBillTransfer extends AbstractTransfer {
    public GetHosBillTransfer(String method, Client client, String messageMethod) {
        super(method, client, messageMethod);
    }

    /**
     * 发送：微信前端JSON数据转换为HIS用的XML数据（微信前端==》HIS）
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String toInvokeMessage(Map<String, Object> params) throws Exception {
        // 身份证号
        String idNo = (String) params.get("idNo");
        // 患者ID
        String patientId = (String) params.get("patientId");
        // 住院次数
        String visitId = (String) params.get("visitId");
        // 开始日期
        String startDate = (String) params.get("startDate");
        // 结束日期
        String endDate = (String) params.get("endDate");


        // 交易ID：his的方法名
        Document document = getTplDoc(getMethod());

        // 将各个入参数设值（入参==》XML）
        Element dataRow = document.getRootElement().element("CommitData").addElement("Data").addElement("DataRow");
        // 身份证号
        dataRow.addAttribute("ID_NO", idNo);
        // 患者ID
        dataRow.addAttribute("PATIENT_ID", patientId);
        // 住院次数
        dataRow.addAttribute("VISIT_ID", visitId);
        // 开始日期
        dataRow.addAttribute("START_DATE", startDate);
        // 结束日期
        dataRow.addAttribute("END_DATE", endDate);

        return document.asXML();
    }

    /**
     * 接收：HIS返回的XML数据并转换为JSON（HIS==》微信前端）
     * @param resMsg
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> toResultMessage(String resMsg) throws Exception {
        Map<String, Object> resMap = new HashMap<>(16);
        Document document = DocumentHelper.parseText(resMsg);

        Element resultInfo = document.getRootElement().element("Result").element("Info");
        String executeStatus = resultInfo.attributeValue("EXECUTE_STATUS");
        String executeMessage = resultInfo.attributeValue("EXECUTE_MESSAGE");
        List<Map<String, Object>> dataList = new ArrayList<>();

        if (Dialect.getSuccessfulState().equals(executeStatus)) {
            // 获取各个参数的值（出参的树状结构：父==》子）
            // 取得数据为数组形式
            List<Element> dataRowList = document.getRootElement().element("ReturnData").element("Data").elements();

            if (dataRowList == null || dataRowList.size() == 0) {
                resMap.put("code", "1403");
                resMap.put("message", "调用成功，但是获取的数据为 0 件！");
            } else {
                for (Element dataRow : dataRowList) {
                    Map<String, Object> subMap = new HashMap<>(16);
                    GetHosBillInnerMessage innerMessage = new GetHosBillInnerMessage(dataRow);

                    // 项目分类编码
                    subMap.put("itemClassCode", innerMessage.getItemClassCode());
                    // 项目分类名称
                    subMap.put("itemClassName", innerMessage.getItemClassName());
                    // 项目金额
                    subMap.put("itemCharges", innerMessage.getItemCharges());
                    // 本清单费用合计
                    subMap.put("billamount", innerMessage.getBillamount());

                    // 追加一行数据到List
                    dataList.add(subMap);
                }

                // 返回所有行数据
                resMap.put("dataList", dataList);

                // 返回Code
                resMap.put("code", executeStatus);
                // 返回信息
                resMap.put("message", "成功！");
            }
        } else {
            resMap.put("code", executeStatus);
            resMap.put("message", executeMessage);
        }
        return resMap;
    }

    public class GetHosBillInnerMessage implements InnerMessage{
        /**
         * 项目分类编码
         */
        private String itemClassCode;
        /**
         * 项目分类名称
         */
        private String itemClassName;
        /**
         * 项目金额
         */
        private String itemCharges;
        /**
         * 本清单费用合计
         */
        private String billamount;




        public GetHosBillInnerMessage(Element element) {
            // 项目分类编码
            this.itemClassCode = element.attributeValue("ITEM_CLASS_CODE");
            // 项目分类名称
            this.itemClassName = element.attributeValue("ITEM_CLASS_NAME");
            // 项目金额
            this.itemCharges = element.attributeValue("ITEM_CHARGES");
            // 本清单费用合计
            this.billamount = element.attributeValue("BILLAMOUNT");
        }

        /**
         * 项目分类编码
         */
        public String getItemClassCode() {
            return itemClassCode;
        }
        /**
         * 项目分类名称
         */
        public String getItemClassName() {
            return itemClassName;
        }
        /**
         * 项目金额
         */
        public String getItemCharges() {
            return itemCharges;
        }
        /**
         * 本清单费用合计
         */
        public String getBillamount() {
            return billamount;
        }
    }
}
